// 1.匹配十六进制的颜色：#ffbbad #Fc01DF #FFF #ffE
// 十六进制 #[0-9a-fA-F]({6}|{3})

const rgb = '#ffbbad #Fc01DF #FFF #ffE'
const reg = /#([\da-fA-F]{6}|[\da-fA-F]{3})/g
console.log(rgb.match(reg)) // ["#ffbbad", "#Fc01DF", "#FFF", "#ffE"]

// 2.匹配时间：24小时制 xx:xx x:x
const time = '23:06'
const ret = /^(0?\d|1\d|2[0-3]):(0?\d|[1-5]\d)$/g
console.log(time.match(ret))

// 3.匹配日期：yyyy-yy-yy
let datereg = /^(\d{4})-(0\d|1[0-2])-(0[1-9]|[12]\d|3[01])$/
console.log(datereg.test('2021-08-10'))

// 4.window操作系统文件路径
// F:\   F:\a\b   F:\a\b\c\  F:\a\b\c\d
const fileReg = /^[a-zA-Z]:\\([^\\:*<>|"?\r\n/]+\\)*([^\\:*<>|"?\r\n/]+)?$/
console.log(fileReg.test('C:\\st\\js\\abc.txt')) // true

// 5.匹配id  从 <div id="container" class="main"></div> 中 提取id
const idReg = /id="[^"]*"/
console.log('<div id="container" class="main"></div>'.match(idReg)[0]) // id="container"

// 6.不匹配任何东西
const noReg = /.^/
console.log(noReg.test('')) // false

// 7.数字的千分位分隔符表示法 123,456,789
const freg = /(?!^)(?=(\d{3})+$)/g
console.log('123456789'.replace(freg, ',')) // 123,456,789

// 7.1 如果要匹配 '123456789 123456789' 加上分隔符
const fregP = /\B(?=(\d{3})+\b)/g
console.log('123456789 123456789'.replace(fregP, ','))

// 8.验证密码问题
// 长度 6~12位 有数字、大小写字母组成，但必须包括至少两种字符
// 也就是不能全是数字 不能全是小写 也不能全是大写
const pwdReg = /(?!^\d{6,12}$)(?!^[a-z]{6,12}$)(?!^[A-Z]{6,12}$)^[\dA-Za-z]{6,12}$/

// 9.更强大日期匹配： yyyy-yy-yy yyyy/yy/yy yyyy.yy.yy
const dateP = /\d{4}(-|\/||\.)\d{2}\1\d{2}/ // 反向引用 引用第一个分组 避免匹配到 yyyy-yy/yy的格式

// 10.字符串trim方法的模拟 去掉字符串开头和结尾的空白符号
function trim(str) {
    return str.replace(/^\s+|\s+$/g, '') // 直接匹配头尾效率更高

    // return str.replace(/^\s*(.*?)\s*$/g,'$1') 匹配整个字符串 然后把需要的数据提取出来
}
console.log(trim(' sad ')) // 'sad'

// 11.将每个单词的首字母转换为大写
function titleize(str) {
    return str.toLowerCase().replace(/(?:^|\s)\w/g, c => {
        return c.toUpperCase()
    })
}
console.log(titleize('i am an ant'))

// 12.驼峰化
function camelize(str) {
    return str.replace(/[_-\s]+(.)?/g, (match, c) => {
        return c ? c.toUpperCase() : ''
    })
}
console.log(camelize('-moz-transform')) // MozTransform

// 13.匹配一个成对标签 <p></p> 而非<span></p>
const tagReg = /<([^>]+)>[\d\D]*<\/\1>/
console.log(tagReg.test('<p>ds</p>')) // true

// 14.身份证
const IDreg = /(\d{15}|\d{17}[\dxX])/

// 15.匹配固定点电话 055188888888 0551-88888888 (0551)88888888
const phoneReg = /^\(?0\d{2,3}\)?-?[1-9]\d{6,7}$/
console.log(phoneReg.test('(0551)88888888')) // true

// 16.匹配 1.23 +1.23 -1.23 10 +10 -10 .2 +.2 -.2等
const numreg = /^[+-]?(\d+\.\d+|\d+|\.\d+)$/

// 17.从日期中切分出年月日
let dateArr = '2121-08-10'.split(/\D/)
console.log(dateArr) // ["2121", "08", "10"]

// 18.将所需数据提取出来
let data = '2021-08-10'.match(/^(?<year>\d{4})\D(?<month>\d{2})\D(?<day>\d{2})$/)
console.log(data) // ["2021-08-10", "2021", "08", "10", index: 0, input: "2021-08-10", groups: {…}]

// 19.利用replace提取
let dayArr = []
'2021-08-10'.replace(/(\d{4})-(\d{2})-(\d{2})/, (match, year, month, day, index, input) => {
    dayArr.push(year, month, day)
})
console.log(dayArr) // ["2021", "08", "10"]

// 20.构造函数的属性
const regex = /([abc])(\d)/g
const string = "a1b2c3d4e5"
string.match(regex)

// 匹配的字符串
console.log(RegExp.input, RegExp["$_"]) // a1b2c3d4e5 a1b2c3d4e5
// 上一次匹配的数据
console.log(RegExp.lastMatch, RegExp["$&"]) // c3 c3
// 上一次捕获的数据
console.log(RegExp.lastParen, RegExp["$+"]) // 3 3
// 上次匹配的数据之前的数据
console.log(RegExp.leftContext, RegExp["$`"]) // a1b2 a1b2
// 上次匹配的数据之后的数据
console.log(RegExp.rightContext, RegExp["$'"]) // d4e5 d4e5